#include "server.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

// 初始化服务器信息
void init_server(ServerInfo* server) {
    server->server_socket = create_server_socket();  // 创建服务器套接字
    server->client_count = 0;  // 初始化客户端计数为0
    pthread_mutex_init(&server->clients_mutex, NULL);  // 初始化客户端互斥锁
    memset(server->clients, 0, sizeof(server->clients));  // 清空客户端信息数组
}

// 客户端线程处理函数
void* client_thread(void* arg) {
    ServerInfo* server = ((void**)arg)[0];  // 获取服务器信息
    int client_index = *(int*)(((void**)arg)[1]);  // 获取客户端索引
    free(arg);  // 释放参数内存

    handle_client(server, client_index);  // 处理客户端请求

    pthread_mutex_lock(&server->clients_mutex);  // 加锁
    close(server->clients[client_index].socket);  // 关闭客户端套接字
    memset(&server->clients[client_index], 0, sizeof(ClientInfo));  // 清空客户端信息
    server->client_count--;  // 减少客户端计数
    pthread_mutex_unlock(&server->clients_mutex);  // 解锁

    return NULL;
}

// 主函数
int main() {
    ServerInfo server;
    init_server(&server);  // 初始化服务器
    bind_and_listen(server.server_socket);  // 绑定并监听

    while (1) {
        int client_sock = accept_client(server.server_socket);  // 接受客户端连接
        if (client_sock != -1) {
            pthread_mutex_lock(&server.clients_mutex);  // 加锁
            if (server.client_count >= MAX_CLIENTS) {
                printf("达到最大客户端连接数,拒绝新连接\n");
                close(client_sock);  // 关闭超出限制的连接
            } else {
                int i;
                // 遍历客户端数组，寻找空闲位置
                for (i = 0; i < MAX_CLIENTS; i++) {
                    // 检查当前位置是否为空闲（socket为0表示空闲）
                    if (server.clients[i].socket == 0) {
                        server.clients[i].socket = client_sock;  // 将新的客户端套接字保存到空闲位置
                        server.client_count++;  // 增加客户端计数
                        break;  // 找到空闲位置后跳出循环
                    }
                }
                pthread_mutex_unlock(&server.clients_mutex);  // 解锁互斥锁，允许其他线程访问共享资源

                // 准备线程参数
                // 为线程参数分配内存，包含两个指针
                void** thread_args = malloc(2 * sizeof(void*));
                // 第一个参数是服务器信息的指针
                thread_args[0] = &server;
                // 为客户端索引分配内存
                int* client_index = malloc(sizeof(int));
                // 将找到的空闲位置索引赋值给客户端索引
                *client_index = i;
                // 第二个参数是客户端索引的指针
                thread_args[1] = client_index;
                // 注意：这些分配的内存需要在线程函数中释放

                // 创建新线程处理客户端
                pthread_t thread;
                if (pthread_create(&thread, NULL, client_thread, thread_args) != 0) {
                    perror("创建线程失败");
                    close(client_sock);  // 关闭客户端连接
                    free(client_index);  // 释放内存
                    free(thread_args);  // 释放内存
                }
            }
        }
    }

    close(server.server_socket);  // 关闭服务器套接字
    pthread_mutex_destroy(&server.clients_mutex);  // 销毁互斥锁
    return 0;
}